home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume91 / utilitys / beav_132 / part01 / wangpc.c < prev    next >
C/C++ Source or Header  |  1991-11-13  |  3KB  |  148 lines

  1. #include "def.h"
  2. #if MSDOS
  3. #include "dos.h"
  4.  
  5. typedef struct SCREENINFO
  6. {
  7.     unsigned char   state;
  8.     unsigned char   scanoff;
  9.     unsigned short  bufseg;
  10.     unsigned char   colors;
  11.     unsigned char   row;
  12.     unsigned char   col;
  13.     unsigned char   attr;
  14.     unsigned char   auxmod;
  15.     unsigned char   auxmod2;
  16. } SCREENINFO;
  17.  
  18. typedef struct SYSCONFIG
  19. {
  20.     unsigned short  version;
  21.     unsigned short  memsize;
  22.     unsigned short  reserved[2];
  23.     unsigned short  screen_count;
  24.     unsigned short  screens[4];
  25. } SYSCONFIG;
  26.  
  27. #define SENDCHAR 6
  28. #define SENDLINE 0x0d
  29. #define BIOS 0x88
  30. #define GETSYSCON 1
  31.  
  32. bool    wang_pc = FALSE;
  33. bool    ibm_pc = FALSE;
  34. bool    mem_map = FALSE;
  35.  
  36. void    is_wang ()
  37. {
  38.     union REGS inregs, outregs;
  39.     struct SREGS    segregs;
  40.     unsigned char *memptr;
  41.     unsigned char    c;
  42.     int     i;
  43.     static  char wang_id[] = {
  44.         "WANG"                        };
  45.     static  char ret_str[6];
  46.     char    *chr_ptr;
  47.  
  48.     chr_ptr = ret_str;
  49.     /* test for Wang PC */
  50.     memptr = (unsigned char *)0xFC003FC2L;
  51.     wang_pc = TRUE;
  52.     for (i=0;(i<4 && wang_pc);i++)
  53.     {
  54.         if(*memptr != wang_id[i])
  55.             wang_pc = FALSE;
  56.         memptr++;
  57.     }
  58.  
  59.     if (wang_pc)
  60.     {
  61.         mem_map = TRUE;
  62.         ret_str[0] = 0xFF;      /* set to known value */
  63.         mem_map = TRUE;
  64.         inregs.h.al = 0x02;
  65.         inregs.h.ah = 0x44;
  66.         inregs.x.bx = 0;
  67.         inregs.x.cx = 1;
  68.         inregs.x.dx = FP_OFF (chr_ptr);
  69.         segregs.ds = FP_SEG (chr_ptr);
  70.  
  71.         int86x (0x21, &inregs, &outregs, &segregs);
  72.         if (ret_str[0] == 0x11)
  73.         {
  74.             ibm_pc = TRUE;
  75.             return;
  76.         }
  77.         ibm_pc = FALSE;
  78.         return;
  79.     }
  80.  
  81.     /* Must be an IBM or clone */
  82.     memptr = (unsigned char *)0xF000FFFEL;
  83.     c = *memptr;
  84.     switch(c)
  85.     {
  86.     case 0xFC:  /* IBM AT or clone */
  87.     case 0xFD:  /* IBM PC Jr */
  88.     case 0xFE:  /* IBM XT or clone */
  89.     case 0xFF:  /* IBM PC or clone */
  90.         mem_map = TRUE;
  91.         ibm_pc = TRUE;
  92.         return;
  93.     }
  94. }
  95.  
  96. int     getsysconfig (outregs, segregs)
  97. union REGS * outregs;
  98. struct SREGS   *segregs;
  99. {
  100.     union REGS inregs;
  101.  
  102.     inregs.h.al = GETSYSCON;
  103.  
  104.     int86x (BIOS, &inregs, outregs, segregs);
  105. }
  106.  
  107. char    getscreenstate ()
  108. {
  109.     struct SREGS    segregs;
  110.     union REGS outregs;
  111.  
  112.     struct SYSCONFIG   *config;
  113.     struct SCREENINFO  *screeninfo;
  114.     unsigned short *shortptr;
  115.     unsigned int    screen_count;
  116.  
  117.     getsysconfig (&outregs, &segregs);
  118.  
  119.     /* set pointer to force register info into a long pointer. */
  120.     shortptr = (unsigned short *) & config;
  121.  
  122.     /* Offset is first, it comes back in BX */
  123.     *shortptr = (unsigned short) outregs.x.bx;
  124.     shortptr++;
  125.  
  126.     /* segment is in ES */
  127.     *shortptr = (unsigned short) segregs.es;
  128.  
  129.     /* Now, the config pointer should be set to the config table. */
  130.     /*  printf("Version = %04x \n",config->version);
  131.     printf("Memsize = %04x \n",config->memsize);
  132.     printf("Screens = %04x \n",config->screen_count);
  133. */
  134.     screen_count = config -> screen_count;
  135.     while (screen_count)
  136.     {
  137.         shortptr = (unsigned short *) & screeninfo;
  138.         *shortptr = (unsigned short) config -> screens[screen_count - 1];
  139.         shortptr++;
  140.         *shortptr = (unsigned short) segregs.es;
  141.         if (screeninfo -> state & 0x80)
  142.             break;
  143.         screen_count--;
  144.     }
  145.     return (screeninfo -> state);
  146. }
  147. #endif
  148.